// 在 Rust 中，不安全代码块用于避开编译器的保护策略；具体地说，不安全代码块主要用于四件事情：
// - 解引用裸指针
// - 通过 FFI 调用函数（外部语言函数接口）
// - 调用不安全的函数
// - 内联汇编（inline assembly）

use std::slice;

fn main() {
    // 解引用一个裸指针只能通过不安全代码块执行
    let raw_p: *const u32 = &10;

    unsafe {
        assert!(*raw_p == 10);
    }

    // 一些函数可以声明为不安全的（unsafe），这意味着在使用它时保证正确性不再是编译器的责任，而是程序员的。
    // 一个例子就是 std::slice::from_raw_parts，向它传入指向第一个元素的指针和长度参数，它会创建一个切片。
    let some_vector = vec![1, 2, 3, 4];

    let pointer = some_vector.as_ptr();
    let length = some_vector.len();

    unsafe {
        let my_slice: &[u32] = slice::from_raw_parts(pointer, length);

        assert_eq!(some_vector.as_slice(), my_slice);
    }
}
